package 中等;

/*
* 最接近原点的 K 个点
* 力扣地址：https://leetcode-cn.com/problems/k-closest-points-to-origin/
*
* 我们有一个由平面上的点组成的列表 points。需要从中找出 K 个距离原点 (0, 0) 最近的点。
*（这里，平面上两点之间的距离是欧几里德距离。）
* 你可以按任何顺序返回答案。除了点坐标的顺序之外，答案确保是唯一的。
* 示例 1：
* 输入：points = [[1,3],[-2,2]], K = 1
* 输出：[[-2,2]]
* 解释：
* (1, 3) 和原点之间的距离为 sqrt(10)，
* (-2, 2) 和原点之间的距离为 sqrt(8)，
* 由于 sqrt(8) < sqrt(10)，(-2, 2) 离原点更近。
* 我们只需要距离原点最近的 K = 1 个点，所以答案就是 [[-2,2]]。
* 思路：Compartator排序，取前K个。
*
* */

import javax.swing.plaf.IconUIResource;
import java.util.*;

public class demo973 {

    public static void main(String[] args) {

//        int[][] kcs = {{1,3},{-2,2}};
        int[][] kcs = {{3,3},{5,-1},{-2,4}};


        kClosest(kcs,1);


    }

    public static int[][] kClosest(int[][] points, int K) {

         int[][] tk = new int[K][];
         ArrayList<ds> kcs = new ArrayList<ds>();

         int zq = 0;


         for (int i=0;i<points.length;i++){

             int x = points[i][0]>0?points[i][0]:-points[i][0];
             int y = points[i][1]>0?points[i][1]:-points[i][1];
             int sq = x*x + y*y;

             kcs.add(new ds(sq,i));

         }

         Collections.sort(kcs);

        Iterator<ds> iterator = kcs.iterator();

        int cou = 0;
        while (iterator.hasNext() && cou < K)
        {
            ds t = iterator.next();
            tk[cou++] = points[t.id];
        }

        //数组也可以使用Compartator
//        Arrays.sort(points, new Comparator<int[]>() {
//            public int compare(int[] point1, int[] point2) {
//                return (point1[0] * point1[0] + point1[1] * point1[1]) - (point2[0] * point2[0] + point2[1] * point2[1]);
//            }
//        });

        return tk;

    }

    static class ds implements Comparable<ds>{
        double data;
        int id;

        public ds(double d,int i){
            this.data = d;
            this.id = i;
        }


        @Override
        public int compareTo(ds o) {

            return Double.compare(this.data,o.data);

        }
    }

}
